import machine
import time
import network
import socket
import _thread
import gc

# 定义 L298N 控制引脚，作为普通数字输出引脚
# 方向控制引脚
input1_pin = machine.Pin(2, machine.Pin.OUT)
input2_pin = machine.Pin(3, machine.Pin.OUT)

# 定义 1 路继电器控制引脚，改为 4
relay_pin = machine.Pin(4, machine.Pin.OUT)
relay_pin.value(0)  # 初始状态下继电器断开

# 定义按钮引脚，启用内部上拉电阻，改为 5
button_pin = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_UP)

# 定义控制灯的引脚
light_pin12 = machine.Pin(12, machine.Pin.OUT)
light_pin13 = machine.Pin(13, machine.Pin.OUT)

# 初始状态下，电机停止，灯 12 和 13 同时亮（程序准备好状态）
input1_pin.value(0)
input2_pin.value(0)
light_pin12.value(1)
light_pin13.value(1)

# 定义时间常量（秒）
forward_time = 1.0
stop_time = 0.5
reverse_time = 1.0

# 配置 ESP32 为 AP 模式
ap = network.WLAN(network.AP_IF)
ap.active(True)
# 设置 WiFi 名称和密码
ssid = 'ESP32 - C3'
password = '123456'
ap.config(essid=ssid, password=password, authmode=network.AUTH_WPA_WPA2_PSK)

# 等待 AP 激活
while not ap.active():
    time.sleep(0.1)

print('AP 已激活')
print('SSID:', ssid)
print('Password:', password)
print('IP 地址:', ap.ifconfig()[0])

# 创建一个简单的 Web 服务器
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到 80 端口
s.bind(('', 80))
s.listen(5)

# 生成 HTML 表单页面
def generate_html():
    html = """
    <html>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user - scalable=no, minimum - scale=1.0, maximum - scale=1.0"/> 
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
        <title>电机控制设置</title>
    </head>
    <body>
        <h1>电机控制设置</h1>
        <p>注意：时间可以输入带小数的数值。</p>
        <form method="get" action="/">
            <label for="forward_time">正转时间 (秒):</label>
            <input type="number" step="0.1" id="forward_time" name="forward_time" value="{}"><br>
            <label for="stop_time">停止时间 (秒):</label>
            <input type="number" step="0.1" id="stop_time" name="stop_time" value="{}"><br>
            <label for="reverse_time">反转时间 (秒):</label>
            <input type="number" step="0.1" id="reverse_time" name="reverse_time" value="{}"><br>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>
    """.format(forward_time, stop_time, reverse_time)
    return html

# 按钮状态，0 表示等待第一次按下，1 表示等待第二次按下
button_state = 0

# 按钮检测线程函数
def button_detection():
    global forward_time, stop_time, reverse_time, button_state
    while True:
        # 检测按钮是否被按下
        if button_pin.value() == 0:
            # 延迟一小段时间以消除按键抖动
            time.sleep_ms(50)
            if button_pin.value() == 0:
                if button_state == 0:
                    # 第一次按下，触发 1 路继电器接通
                    relay_pin.value(1)
                    button_state = 1
                elif button_state == 1:
                    # 第二次按下，正常进行代码部分
                    # 电机正转，灯 12 亮，灯 13 灭
                    input1_pin.value(1)
                    input2_pin.value(0)
                    light_pin12.value(1)
                    light_pin13.value(0)
                    time.sleep(forward_time)

                    # 电机停止，灯 12 和 13 同时亮
                    input1_pin.value(0)
                    input2_pin.value(0)
                    light_pin12.value(1)
                    light_pin13.value(1)
                    time.sleep(stop_time)

                    # 电机反转，灯 12 灭，灯 13 亮
                    input1_pin.value(0)
                    input2_pin.value(1)
                    light_pin12.value(0)
                    light_pin13.value(1)
                    time.sleep(reverse_time)

                    # 电机停止，灯 12 和 13 同时亮
                    input1_pin.value(0)
                    input2_pin.value(0)
                    light_pin12.value(1)
                    light_pin13.value(1)

                    # 等待 0.5 秒后断开 1 路继电器
                    time.sleep(0.5)
                    relay_pin.value(0)
                    button_state = 0

                # 等待按钮释放
                while button_pin.value() == 0:
                    pass

# 启动按钮检测线程
_thread.start_new_thread(button_detection, ())

# 处理 Web 服务器请求
while True:
    try:
        conn, addr = s.accept()
        print('收到来自 %s 的连接' % str(addr))
        request = conn.recv(1024)
        request = str(request)

        # 解析请求中的参数
        if 'GET /?' in request:
            params = request.split('GET /?')[1].split(' ')[0].split('&')
            for param in params:
                key, value = param.split('=')
                if key == 'forward_time':
                    try:
                        forward_time = float(value)
                        print(f"正转时间更新为: {forward_time} 秒")
                    except ValueError:
                        print(f"无效的正转时间输入: {value}")
                elif key == 'stop_time':
                    try:
                        stop_time = float(value)
                        print(f"停止时间更新为: {stop_time} 秒")
                    except ValueError:
                        print(f"无效的停止时间输入: {value}")
                elif key == 'reverse_time':
                    try:
                        reverse_time = float(value)
                        print(f"反转时间更新为: {reverse_time} 秒")
                    except ValueError:
                        print(f"无效的反转时间输入: {value}")

        # 发送 HTML 页面响应
        response = generate_html()
        conn.send('HTTP/1.1 200 OK\n')
        conn.send('Content-type: text/html\n')
        conn.send('Connection: close\n\n')
        conn.sendall(response)
        conn.close()
        gc.collect()  # 释放内存
    except OSError:
        pass